package com.itheima.nio.buffer.demo04;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/**
 * 使用NIO技术基于TCP协议完成服务端代码实现
 */
public class NioServerDemo01 {

    public static void main(String[] args) throws IOException {

        /**
         * 步骤：
         * 1. 打开一个ServerSocketChannel通道
         * 2. 绑定端口号
         * 3. 设置为非阻塞模式
         * 4. 获取连接
         * 5. 创建Buffer对象(用于从通道中读取数据)
         * 6. 读取数据到Buffer中
         * 7. 释放资源
         */
        // 1. 打开一个ServerSocketChannel通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

        // 2. 绑定端口号
        // public InetSocketAddress(int port)
        serverSocketChannel.socket().bind(new InetSocketAddress(8080));

        // 3. 设置为非阻塞模式
        serverSocketChannel.configureBlocking(false) ;

        while (true) {

            // 4. 获取连接
            // 当我们把serverSocketChannel设置为了非阻塞式，那么我们再次调用accept方法的时候，这个方法已经不再阻塞了，当没有客户端连接的时候
            // 此时这个方法的返回值就是null
            SocketChannel socketChannel = serverSocketChannel.accept();

            if(socketChannel != null) {

                // 5. 创建Buffer对象(用于从通道中读取数据)
                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

                // 6. 读取数据到Buffer中
                int read = socketChannel.read(byteBuffer);          // 返回值代表的就是读取到的有效的字节个数
                byte[] array = byteBuffer.array();
                System.out.println(new String(array , 0 , read));

                // 7. 释放资源
                socketChannel.close();
                // serverSocketChannel.close(); 不需要进行关闭

            }

        }

    }

}
